'use strict'

module.exports = core
const path = require('path')
const commander = require('commander')
const log = require('@xykj-cli-dev/log')
const init = require('@xykj-cli-dev/init')
const exec = require('@xykj-cli-dev/exec')

const semver = require('semver') // 版本比较插件
const colors = require('colors/safe') // 打印有颜色的字体
const userHome = require('user-home') // 判断用户主目录(这个包现在已经废弃)
// import {homedir} from os
// const os = require('os')  // os.homedir  来获取主目录
const pathExists = require('path-exists').sync // 判断文件是否存在 这个要import引入
const pkg = require('../package')
const constant = require('./const')

const program = new commander.Command();
let args,config

async function core(){
    try{
        await prepare()
        log.verbose('debug','test debugger')
        registerCommand()
    }catch (e) {
        console.log(e)
        //log.error(e.message)
    }
}

async function prepare(){
    checkPkgVersion()
    checkRoot() // root降级
    checkUserHome()
    //checkInputArgs()
    //checkArgs()
    checkEnv() // 环境变量
    await checkGlobalUpdate()
}

function checkPkgVersion(){
    let version = pkg.version
    console.log(version)
    //log.success('jj','123')
}
function checkRoot(){
    if(process.platform != 'win32'){
        //console.log(process.geteuid)// window 平台不支持
        //const rootCheck = require('root-check')
        //rootCheck() // 如果是苹果系统或linux 使用sudo 时会改变成一般用户，因为管理员权限创建的文件后期读写麻烦
        //console.log(process.geteuid())
    }
}
function checkUserHome() {
    // !pathExists(userHome)
    if(!userHome){
        throw new Error(colors.red('当前用户主目录不存在'))
    }
}
function checkInputArgs() {
    const minimist = require('minimist') // 命令行参数解析
    args = minimist(process.argv.slice(2))
    console.log('当前参数解析',args)
}
function checkArgs(){
    process.env.LOG_LEVEL =  args.debug ? 'verbose' : 'info'
    log.level = process.env.LOG_LEVEL // 修改打印等级，指令中有 --debug 时打印更多信息
}
function checkEnv(){
    const dotEnv = require('dotenv')
    config = dotEnv.config() // 在项目根目录下创建一个 .env 文件
    const dotenvPath = path.resolve(userHome,'.env')
    if(pathExists(dotenvPath)){
         config = dotEnv.config({
            path:dotenvPath
         })
    }
    // config 的数据格式为 { parsed: { 'XYKJ_BASE_URL': 'su.com:7002', 'XYKJ_TEST': 'test666' } }
    // let keys = Object.keys(config.parsed)
    // console.log('keys',keys);
    // keys.forEach(key=>{
    //     process.env[key] = config['parsed'][key]
    // })
    console.log('envList',process.env);
    createDefaultConfig()
    log.verbose('环境变量',process.env.CLI_HOME_PATH)
}
function createDefaultConfig(){
    const cliConfig = {
        home:userHome
    }
    //console.log('path.join',constant.DEFAULT_CLI_HOME)
    if(process.env.CLI_HOME){
        cliConfig['cliHome'] = path.join(userHome,process.env.CLI_HOME)
    }else{
        cliConfig['cliHome'] = path.join(userHome,constant.DEFAULT_CLI_HOME)
    }
    process.env.CLI_HOME_PATH = cliConfig.cliHome
}
// 检查是否要全局更新
async function checkGlobalUpdate(){
    // 1.获取当前版本号和模块名
    const currentVersion = '1.1.1' || pkg.version
    const npmName = pkg.name
    // 2.调用npm API 获取所有版本号
    const {getNpmSemverVersion} = require('@xykj-cli-dev/get-npm-info')
    const lastVersion = await getNpmSemverVersion(currentVersion,npmName)
    if(lastVersion && semver.gt(lastVersion,currentVersion)){
        log.warn(colors.bgYellow(`请手动更新${npmName}至${lastVersion}`))
    }
    // 3. 提取所有版本号，比对哪些版本号大于本地版本
}
// 注册命令
function registerCommand(){
    program
        .name('xykj')
        .usage("<command> [options]")
        .version(pkg.version)
        .option('-d, --debug','是否开启调试模式',false)
        .option('-tp, --targetPath <targetPath>','是否指定本地调试文件','')

    // 注册命令
    program
       // .command('init [projectName] [age]')
        .command('init')
        .argument('<projectName>')
        .option('-f,--force <force>','是否强制初始化项目')
        .action(exec)
    program
        .command('exec')
        .argument("<execName>")
        // .argument("[test]")
        .option('-ex,--exec <exec>')
        .option('-s,--save <save>')
        .action(exec)
    // 监听debug
    program.on('option:debug',function(){
        console.log('参数集',program.opts())
        if(program.opts().debug){
            process.env.LOG_LEVEL = 'verbose'
        }else{
            process.env.LOG_LEVEL = 'info'
        }
        console.log('LOG_LEVEL',process.env.LOG_LEVEL)
        log.level = process.env.LOG_LEVEL
        log.verbose('test')
    })
    // 对未知指令的监听
    program.on('command:*',function(obj){
        const availableCommands = program.commands.map(cmd=>cmd.name())
    })
    // 在环境变量中设置目标路径
    program.on('option:targetPath',function(){
        process.env.CLI_TARGET_PATH = program.opts().targetPath
    })
    // 如果没有输入任何指令，给提示文档
    if(process.argv.length < 3){
        program.outputHelp()
        console.log() // 打印一行空行，更美观
    }
    program.parse(process.argv)
}























